Collections এবং Sequence (Collections and Sequences)

Computer Programming - ক্লোজার (Clojure)
275
275

ক্লোজার এ কালেকশনস এবং সিকোয়েন্স (Collections and Sequences in Clojure)

ক্লোজারে (Clojure) ডেটা ব্যবস্থাপনার জন্য শক্তিশালী কালেকশন টাইপস এবং সিকোয়েন্স ফাংশন রয়েছে। কালেকশন এবং সিকোয়েন্স ব্যবহার করে ডেটা সহজে ম্যানিপুলেট করা যায়। ক্লোজারে চারটি প্রধান কালেকশন টাইপ রয়েছে: লিস্ট, ভেক্টর, ম্যাপ, এবং সেট।


কালেকশন টাইপস (Collection Types)

১. লিস্ট (List)

লিস্ট একটি সংযুক্ত ডেটা কাঠামো যা প্যারেনথেসিস ( ) দিয়ে লেখা হয় এবং সাধারণত quote দিয়ে শুরু হয় যাতে এটি ফাংশন কল হিসেবে কার্যকর না হয়। লিস্ট ক্লোজারে লাজি (lazy) হয়, অর্থাৎ এটি কেবলমাত্র প্রয়োজন অনুযায়ী মান তৈরি করে।

'(1 2 3) ; আউটপুট: (1 2 3)

লিস্ট অপারেশন:

  • first: প্রথম মান প্রদান করে।

    (first '(1 2 3)) ; আউটপুট: 1
  • rest: প্রথম মান বাদে বাকিগুলোর সিকোয়েন্স প্রদান করে।

    (rest '(1 2 3)) ; আউটপুট: (2 3)
  • cons: একটি মান যুক্ত করে।

    (cons 0 '(1 2 3)) ; আউটপুট: (0 1 2 3)

২. ভেক্টর (Vector)

ভেক্টর একটি অর্ডারড কালেকশন, যা দ্রুত এক্সেসের জন্য ব্যবহৃত হয় এবং [ ] ব্র্যাকেটের মধ্যে লেখা হয়। এটি ইমিউটেবল হলেও, ভেক্টর অ্যাক্সেস এবং আপডেটের জন্য কার্যকর।

[1 2 3] ; আউটপুট: [1 2 3]

ভেক্টর অপারেশন:

  • get: নির্দিষ্ট ইনডেক্সের মান প্রদান করে।

    (get [10 20 30] 1) ; আউটপুট: 20
  • conj: নতুন মান যুক্ত করে।

    (conj [1 2 3] 4) ; আউটপুট: [1 2 3 4]

৩. ম্যাপ (Map)

ম্যাপ কী-ভ্যালু পেয়ারের ডেটা কাঠামো, যা { } ব্র্যাকেটের মধ্যে লেখা হয়। ম্যাপ ব্যবহার করে দ্রুত মান অনুসন্ধান এবং ম্যানিপুলেট করা যায়।

{:name "Alice" :age 25} ; আউটপুট: {:name "Alice", :age 25}

ম্যাপ অপারেশন:

  • get: নির্দিষ্ট কী-এর মান প্রদান করে।

    (get {:name "Alice" :age 25} :name) ; আউটপুট: "Alice"
  • assoc: নতুন কী-ভ্যালু পেয়ার যুক্ত বা আপডেট করে।

    (assoc {:name "Alice"} :age 25) ; আউটপুট: {:name "Alice", :age 25}
  • dissoc: নির্দিষ্ট কী মুছে ফেলে।

    (dissoc {:name "Alice" :age 25} :age) ; আউটপুট: {:name "Alice"}

৪. সেট (Set)

সেট এমন একটি কালেকশন যা অনন্য মান সংরক্ষণ করে। সেট {# } চিহ্ন দিয়ে লেখা হয়। ক্লোজারে সাধারণত hash-set ব্যবহার করা হয়।

#{1 2 3} ; আউটপুট: #{1 2 3}

সেট অপারেশন:

  • conj: নতুন মান যুক্ত করে।

    (conj #{1 2} 3) ; আউটপুট: #{1 2 3}
  • disj: নির্দিষ্ট মান মুছে ফেলে।

    (disj #{1 2 3} 2) ; আউটপুট: #{1 3}

সিকোয়েন্সেস (Sequences)

সিকোয়েন্সেস ক্লোজারে একটি মৌলিক ডেটা টাইপ, যা বিভিন্ন কালেকশনকে একরকম ইন্টারফেসে নিয়ে আসে। ক্লোজারে সিকোয়েন্স তৈরি করতে seq ফাংশন ব্যবহার করা হয়।

(seq [1 2 3]) ; আউটপুট: (1 2 3)

সিকোয়েন্স অপারেশন:

  • first: প্রথম মান প্রদান করে।

    (first [1 2 3]) ; আউটপুট: 1
  • rest: প্রথম মান বাদে বাকিগুলো প্রদান করে।

    (rest [1 2 3]) ; আউটপুট: (2 3)
  • map, reduce, filter: সিকোয়েন্সেস ম্যানিপুলেশনের জন্য উচ্চ-স্তরের ফাংশন।

উদাহরণ:

(map #(* % %) [1 2 3]) ; আউটপুট: (1 4 9)

Lazy Sequences

ক্লোজারে সিকোয়েন্সেস lazy হতে পারে, অর্থাৎ প্রয়োজন না হওয়া পর্যন্ত এটি তৈরি হবে না। এটি বড় ডেটাসেট নিয়ে কাজ করার ক্ষেত্রে কার্যকরী।

(take 5 (range)) ; আউটপুট: (0 1 2 3 4)

এখানে range একটি লাজি সিকোয়েন্স তৈরি করে যা ০ থেকে শুরু করে অসীম সংখ্যার ধারাবাহিক সিকোয়েন্স।


সিকোয়েন্স প্রসেসিংয়ের উচ্চ স্তরের ফাংশনসমূহ

  • map: প্রতিটি আইটেমে একটি ফাংশন প্রয়োগ করে।

    (map inc [1 2 3]) ; আউটপুট: (2 3 4)
  • reduce: একটি একক ফলাফল রিডিউস করে।

    (reduce + [1 2 3]) ; আউটপুট: 6
  • filter: নির্দিষ্ট শর্তে আইটেম ফিল্টার করে।

    (filter odd? [1 2 3 4]) ; আউটপুট: (1 3)

সারসংক্ষেপ

ক্লোজারে লিস্ট, ভেক্টর, ম্যাপ, এবং সেট প্রধান কালেকশন টাইপস এবং এগুলো ইমিউটেবল। সিকোয়েন্স ইন্টারফেস ব্যবহার করে ক্লোজার ডেটা প্রসেসিং সহজ করে। Lazy সিকোয়েন্স বড় ডেটাসেটের উপর কার্যকরী প্রমাণিত হয়, এবং উচ্চ-স্তরের ফাংশনগুলো কোডকে আরও সংক্ষিপ্ত ও কার্যকর করে তোলে।

common.content_added_by

Clojure এর Immutable Collections এর ধারণা

232
232

ক্লোজার (Clojure) এর Immutable Collections এর ধারণা

ক্লোজার একটি ফাংশনাল প্রোগ্রামিং ভাষা, এবং এটি ইমিউটেবল ডেটা কাঠামো ব্যবহারকে জোর দেয়। ইমিউটেবল কালেকশন এমন একটি ডেটা কাঠামো যেখানে ডেটা একবার সেট হলে তা পরিবর্তন করা যায় না। প্রতিবার পরিবর্তনের পরিবর্তে একটি নতুন ডেটা কাঠামো তৈরি করা হয়, যেখানে আগের ডেটার পরিবর্তন প্রতিফলিত হয় না। এই ধারণাটি ক্লোজারে কার্যক্ষমতা এবং নিরাপত্তা নিশ্চিত করে এবং কনকারেন্ট প্রোগ্রামিংয়ের জন্য একে একটি শক্তিশালী ভাষায় পরিণত করে।


Immutable Collections এর প্রয়োজনীয়তা এবং উপকারিতা

ইমিউটেবল কালেকশন ব্যবহারের পেছনে কিছু গুরুত্বপূর্ণ কারণ রয়েছে, বিশেষ করে ফাংশনাল প্রোগ্রামিং এবং মাল্টি-থ্রেডিং এনভায়রনমেন্টে:

  1. নিরাপত্তা: যেহেতু ডেটা পরিবর্তন করা যায় না, এটি মেমোরিতে কনকারেন্ট প্রোগ্রামিংয়ের জন্য নিরাপদ।
  2. ডেটার পূর্বাবস্থা সংরক্ষণ: প্রতিটি পরিবর্তনের সময় একটি নতুন ডেটা কাঠামো তৈরি হয়, ফলে আগের ডেটার অবস্থা অক্ষুণ্ণ থাকে।
  3. মেমোরি সাশ্রয়ী: ক্লোজারের ইমিউটেবল কালেকশন ডেটা শেয়ারিংয়ের মাধ্যমে আংশিকভাবে পুনরায় ব্যবহারযোগ্য, তাই নতুন ডেটা তৈরিতে মেমোরি ব্যবহারে দক্ষতা অর্জন করা যায়।

ক্লোজারের Immutable Collections এর ধরন

ক্লোজারে প্রধান চারটি ইমিউটেবল কালেকশন রয়েছে: List, Vector, Set, এবং Map। প্রতিটি কালেকশনই ইমিউটেবল এবং প্রতিটি ব্যবহারের জন্য উপযুক্ত।

১. List (লিস্ট)

লিস্ট একটি সংযুক্ত এবং ইমিউটেবল ডেটা কাঠামো, যা একটি নির্দিষ্ট ক্রমে ডেটা সংরক্ষণ করে। নতুন মান যোগ করা হলে একটি নতুন লিস্ট তৈরি হয়, কিন্তু পূর্বের লিস্টটি অপরিবর্তিত থাকে।

(def my-list '(1 2 3))
(def new-list (cons 0 my-list))

; আউটপুট:
; my-list: (1 2 3)
; new-list: (0 1 2 3)

২. Vector (ভেক্টর)

ভেক্টর একটি ইমিউটেবল এবং ইন্ডেক্সড ডেটা কাঠামো, যা দ্রুত অ্যাক্সেস এবং সংশোধনের জন্য উপযুক্ত। এটি সাধারণত তালিকা ডেটা সঞ্চিত রাখতে ব্যবহৃত হয়।

(def my-vector [1 2 3])
(def new-vector (conj my-vector 4))

; আউটপুট:
; my-vector: [1 2 3]
; new-vector: [1 2 3 4]

৩. Set (সেট)

সেট একটি ইমিউটেবল কালেকশন যা অনন্য মান সংরক্ষণ করে। নতুন মান যোগ করলে এটি একটি নতুন সেট তৈরি করে, যেখানে পূর্বের সেট পরিবর্তন হয় না।

(def my-set #{1 2 3})
(def new-set (conj my-set 4))

; আউটপুট:
; my-set: #{1 2 3}
; new-set: #{1 2 3 4}

৪. Map (ম্যাপ)

ম্যাপ একটি কী-ভ্যালু পেয়ার ভিত্তিক ইমিউটেবল ডেটা কাঠামো, যা অ্যাসোসিয়েটিভ ডেটা সংরক্ষণের জন্য ব্যবহৃত হয়। নতুন কী-ভ্যালু জোড়া যোগ করলে এটি একটি নতুন ম্যাপ তৈরি করে।

(def my-map {:name "Alice" :age 30})
(def new-map (assoc my-map :city "New York"))

; আউটপুট:
; my-map: {:name "Alice", :age 30}
; new-map: {:name "Alice", :age 30, :city "New York"}

ইমিউটেবল কালেকশনের কার্যকারিতা

ক্লোজারের ইমিউটেবল কালেকশনগুলি কিছু অপারেশন সহজে সম্পাদন করতে সাহায্য করে:

  • ডেটা পরিবর্তন না করে কপি তৈরি: প্রতিবার পরিবর্তনের জন্য নতুন কালেকশন তৈরি হয়, যা মূল ডেটাকে অপরিবর্তিত রাখে।
  • ডেটার পূর্বাবস্থা সহজে সংরক্ষণ: পূর্বাবস্থা বজায় রেখে নতুন অবস্থার সাথে ডেটা ম্যানিপুলেট করা যায়।
  • কনকারেন্ট প্রোগ্রামিং সহজ করে: একই ডেটা কাঠামো বিভিন্ন থ্রেডে ব্যবহার করলেও ডেটা নিরাপদ থাকে।

সারসংক্ষেপ

কালেকশনবৈশিষ্ট্যউদাহরণ
Listসংযুক্ত, ক্রমিত ডেটা স্ট্রাকচার(1 2 3) এবং নতুন (0 1 2 3)
Vectorইন্ডেক্সড, দ্রুত অ্যাক্সেসযোগ্য[1 2 3] এবং নতুন [1 2 3 4]
Setঅনন্য মান সংরক্ষিত#{1 2 3} এবং নতুন #{1 2 3 4}
Mapকী-ভ্যালু পেয়ার ভিত্তিক{:name "Alice", :age 30} এবং নতুন {:name "Alice", :age 30, :city "New York"}

ক্লোজারের ইমিউটেবল কালেকশনগুলো ফাংশনাল প্রোগ্রামিংয়ের জন্য উপযুক্ত এবং নিরাপদ ডেটা হ্যান্ডলিং নিশ্চিত করে, যা বিশেষ করে কনকারেন্ট প্রোগ্রামিংয়ে কার্যকর।

common.content_added_by

List, Vector, Set এবং Map এর ব্যবহার

205
205

List, Vector, Set, এবং Map এর ব্যবহার

ক্লোজার (Clojure) একটি ফাংশনাল প্রোগ্রামিং ভাষা, যা বিভিন্ন ধরনের ডেটা কাঠামো সরবরাহ করে যেমন List, Vector, Set, এবং Map। প্রতিটি ডেটা কাঠামো নির্দিষ্ট পরিস্থিতিতে ব্যবহৃত হয় এবং তাদের নিজস্ব সুবিধা রয়েছে। নিচে প্রতিটি ডেটা কাঠামো এবং তাদের ব্যবহার সম্পর্কিত বিস্তারিত আলোচনা করা হলো।


১. List (লিস্ট)

List একটি সংযুক্ত ডেটা কাঠামো যা এলিমেন্টগুলোকে একটি নির্দিষ্ট ক্রমে সংরক্ষণ করে। এটি সাধারণত সিকোয়েন্স ডেটা হিসেবে ব্যবহৃত হয় এবং সাধারণত ফাংশনাল প্রোগ্রামিংয়ে রিকার্সন বা ফাংশনাল অ্যাক্টিভেশন চেইন করার জন্য ব্যবহার করা হয়।

ব্যবহার:

  • সংযুক্ত ডেটা কাঠামো: লিস্টে এলিমেন্টগুলো একে অপরের সাথে সংযুক্ত থাকে, এবং এটি সাধারণত রিকার্সিভ অপারেশন বা ফাংশনাল প্রোগ্রামিংয়ে ব্যবহৃত হয়।
  • ফাংশনাল প্রোগ্রামিং: ফাংশনাল প্রোগ্রামিংয়ে লিস্ট ম্যানিপুলেশন কার্যকরী হতে পারে।

উদাহরণ:

(def my-list '(1 2 3 4 5))

; লিস্ট থেকে প্রথম আইটেম পেতে
(first my-list)  ; আউটপুট: 1

; লিস্ট থেকে বাকি আইটেম পেতে
(rest my-list)   ; আউটপুট: (2 3 4 5)

; নতুন আইটেম যোগ করতে
(cons 0 my-list) ; আউটপুট: (0 1 2 3 4 5)

২. Vector (ভেক্টর)

Vector একটি ইমিউটেবল, ইন্ডেক্সড ডেটা কাঠামো যা দ্রুত অ্যাক্সেসের জন্য উপযোগী। এটি ইন্ডেক্সের মাধ্যমে দ্রুত ডেটা অ্যাক্সেস এবং সংশোধনের সুবিধা দেয়। Vector সাধারণত এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে দ্রুত অ্যাক্সেসের প্রয়োজন।

ব্যবহার:

  • ফাস্ট অ্যাক্সেস: ভেক্টরে এলিমেন্টগুলো ইন্ডেক্সের মাধ্যমে অ্যাক্সেস করা যায়, তাই অ্যাক্সেসের সময় জটিলতা কম থাকে।
  • ডেটা সংশোধন: ভেক্টর ডেটাকে দ্রুত সংশোধন করা যায়, কারণ এটি ইন্ডেক্সেড ডেটা কাঠামো।

উদাহরণ:

(def my-vector [1 2 3 4 5])

; ভেক্টর থেকে দ্বিতীয় আইটেম পেতে
(nth my-vector 1) ; আউটপুট: 2

; ভেক্টরের শেষে একটি আইটেম যোগ করতে
(conj my-vector 6) ; আউটপুট: [1 2 3 4 5 6]

; ভেক্টরের দৈর্ঘ্য পেতে
(count my-vector) ; আউটপুট: 5

৩. Set (সেট)

Set একটি ডেটা কাঠামো যা শুধুমাত্র অনন্য (unique) মান সংরক্ষণ করে, অর্থাৎ, এতে ডুপ্লিকেট আইটেম থাকতে পারে না। এটি সাধারণত ডেটার মেম্বারশিপ যাচাই এবং ইউনিক মান নিশ্চিত করার জন্য ব্যবহৃত হয়।

ব্যবহার:

  • ডুপ্লিকেট অপসারণ: সেট ব্যবহারের মাধ্যমে ডুপ্লিকেট মানগুলি সরিয়ে ফেলা যায়।
  • মেম্বারশিপ যাচাই: একটি সেটে কোনো মান আছে কিনা তা দ্রুত যাচাই করা যায়।

উদাহরণ:

(def my-set #{1 2 3 4 5})

; সেটে একটি মান আছে কিনা চেক করা
(contains? my-set 3) ; আউটপুট: true

; নতুন আইটেম যোগ করতে
(conj my-set 6) ; আউটপুট: #{1 2 3 4 5 6}

; একটি আইটেম বাদ দিতে
(disj my-set 2) ; আউটপুট: #{1 3 4 5}

৪. Map (ম্যাপ)

Map একটি কী-ভ্যালু পেয়ার ডেটা কাঠামো, যেখানে প্রতিটি কী (key) একটি মান (value) নির্দেশ করে। এটি সাধারণত অ্যাসোসিয়েটিভ ডেটা মডেল এবং দ্রুত অনুসন্ধান করার জন্য ব্যবহৃত হয়।

ব্যবহার:

  • অ্যাসোসিয়েটিভ ডেটা: Map সাধারণত ডেটার অ্যাসোসিয়েটিভ ভ্যালু স্টোরেজে ব্যবহৃত হয়, যেমন ব্যবহারকারীর তথ্য সংরক্ষণ করা (ইমেইল-কী, নাম-ভ্যালু পেয়ার)।
  • কী-ভ্যালু পেয়ার অনুসন্ধান: Map খুব দ্রুত নির্দিষ্ট কী এর মান খুঁজে বের করতে সাহায্য করে।

উদাহরণ:

(def my-map {:name "Alice" :age 30 :city "New York"})

; একটি কী এর মান পেতে
(:name my-map) ; আউটপুট: "Alice"

; নতুন কী-ভ্যালু পেয়ার যোগ করতে
(assoc my-map :country "USA") ; আউটপুট: {:name "Alice", :age 30, :city "New York", :country "USA"}

; একটি কী-ভ্যালু পেয়ার বাদ দিতে
(dissoc my-map :city) ; আউটপুট: {:name "Alice", :age 30}

সারসংক্ষেপ

ডেটা কাঠামোবৈশিষ্ট্যব্যবহার
Listসংযুক্ত, অর্ডারড ডেটারিকার্সন, ফাংশনাল প্রোগ্রামিং
Vectorইমিউটেবল, ইন্ডেক্সড ডেটাদ্রুত অ্যাক্সেস, সংশোধন
Setঅনন্য মানডুপ্লিকেট অপসারণ, মেম্বারশিপ যাচাই
Mapকী-ভ্যালু পেয়ার, অ্যাসোসিয়েটিভ ডেটাদ্রুত অনুসন্ধান, অ্যাসোসিয়েটিভ ডেটা

এই ডেটা কাঠামোগুলো ক্লোজার প্রোগ্রামিংয়ে ডেটা ম্যানিপুলেশন, সংরক্ষণ এবং অ্যাক্সেস করার জন্য অত্যন্ত কার্যকরী এবং ফাংশনাল প্রোগ্রামিংয়ের জন্য উপযুক্ত।

common.content_added_by

Sequence API এবং Lazy Sequences

210
210

Sequence API এবং Lazy Sequences in Clojure

Clojure তে সিকোয়েন্স (sequences) একটি গুরুত্বপূর্ণ কনসেপ্ট, এবং এটি এক ধরনের ফাংশনাল ডেটা স্ট্রাকচার হিসেবে কাজ করে। সিকোয়েন্স API হল একটি সেট ফাংশন যা বিভিন্ন ধরনের ডেটা কাঠামোকে সিকোয়েন্সে রূপান্তর করতে সাহায্য করে, যেমন: লিস্ট, ভেক্টর, সেট, ম্যাপ ইত্যাদি। এই API ব্যবহার করে ডেটা ম্যানিপুলেশন, ট্রান্সফরমেশন এবং ফিল্টার করা খুবই সহজ হয়। এর মধ্যে গুরুত্বপূর্ণ একটি বৈশিষ্ট্য হল Lazy Sequences যা মেমোরি দক্ষ এবং অবজেক্টিভ প্রোগ্রামিংয়ে খুবই কার্যকরী।


Sequence API

Clojure এর সিকোয়েন্স API এমন একটি সুবিধাজনক ফিচার যা বিভিন্ন প্রকারের সংগ্রহকে সিকোয়েন্সের মধ্যে রূপান্তর করতে এবং সেই সিকোয়েন্সের উপাদানগুলোর ওপর বিভিন্ন কার্যকলাপ করতে সাহায্য করে। এই API বেশ কিছু বিল্ট-ইন ফাংশন সরবরাহ করে, যেমন map, filter, reduce, first, rest, cons, ইত্যাদি।

প্রধান Sequence Functions

  1. first: সিকোয়েন্সের প্রথম উপাদান ফেরত দেয়।

    (first [1 2 3 4])  ; আউটপুট: 1
  2. rest: সিকোয়েন্সের প্রথম উপাদান ছাড়া বাকি উপাদানগুলো ফেরত দেয়।

    (rest [1 2 3 4])  ; আউটপুট: (2 3 4)
  3. cons: একটি নতুন উপাদান যুক্ত করে সিকোয়েন্সের শুরুতে।

    (cons 0 [1 2 3])  ; আউটপুট: (0 1 2 3)
  4. map: একটি ফাংশন প্রয়োগ করে সিকোয়েন্সের প্রতিটি উপাদান পরিবর্তন করে।

    (map inc [1 2 3 4])  ; আউটপুট: (2 3 4 5)
  5. filter: একটি শর্ত অনুযায়ী সিকোয়েন্সের উপাদান ফিল্টার করে।

    (filter even? [1 2 3 4 5 6])  ; আউটপুট: (2 4 6)
  6. reduce: সিকোয়েন্সের উপাদানগুলোর ওপর একটি একক অপারেশন প্রয়োগ করে একটি একক মান তৈরি করে।

    (reduce + [1 2 3 4])  ; আউটপুট: 10
  7. take: সিকোয়েন্সের প্রথম n উপাদান বের করে।

    (take 3 [1 2 3 4 5])  ; আউটপুট: (1 2 3)
  8. drop: সিকোয়েন্সের প্রথম n উপাদান বাদ দেয়।

    (drop 2 [1 2 3 4 5])  ; আউটপুট: (3 4 5)

Lazy Sequences

Lazy sequences হল এমন সিকোয়েন্স যা শুধু তখনই মূল্যায়ন (evaluation) হয় যখন তাদের উপাদানগুলো প্রয়োজন পড়ে। সাধারণভাবে, Clojure-এ সিকোয়েন্সগুলোর উপর কোনো অপারেশন সম্পাদন করলে পুরো সিকোয়েন্স তৈরি হয়ে যায়, তবে লেজি সিকোয়েন্সের ক্ষেত্রে শুধুমাত্র প্রয়োজনীয় উপাদানগুলোর উপর অপারেশন চালানো হয় এবং শুধুমাত্র তাদের হিসেবেই মূল্যায়ন করা হয়। এতে মেমোরি সাশ্রয় হয় এবং বড় সিকোয়েন্সের ক্ষেত্রে এটি কার্যকরী।

Lazy Sequence এর ব্যবহার

  1. range: লেজি সিকোয়েন্স তৈরি করতে range ফাংশন ব্যবহার করা হয়। এটি একটি ইনফিনিট সিকোয়েন্স তৈরি করে, কিন্তু আপনি যদি শুধুমাত্র কিছু উপাদান প্রয়োজন করেন, তবে Clojure শুধুমাত্র সেগুলো মূল্যায়ন করবে।

    (take 5 (range))  ; আউটপুট: (0 1 2 3 4)
  2. lazy-seq: lazy-seq ফাংশন ব্যবহার করে আপনি একটি কাস্টম লেজি সিকোয়েন্স তৈরি করতে পারেন।

    (defn fib [a b]
      (lazy-seq (cons a (fib b (+ a b)))))
    
    (take 10 (fib 0 1))  ; আউটপুট: (0 1 1 2 3 5 8 13 21 34)

    এখানে, fib একটি লেজি সিকোয়েন্স তৈরি করে যা ফিবোনাচ্চি সিরিজের পরবর্তী সংখ্যা উৎপন্ন করে। lazy-seq নিশ্চিত করে যে পরবর্তী সংখ্যাটি শুধু তখনই তৈরি হবে যখন তা প্রয়োজন হবে।


লেজি সিকোয়েন্সের সুবিধা

  1. মেমোরি সাশ্রয়ী: লেজি সিকোয়েন্সের মাধ্যমে, Clojure শুধুমাত্র প্রয়োজনীয় উপাদানগুলোকে মেমোরিতে লোড করে, ফলে মেমোরি ব্যবহারের ক্ষেত্রে তা বেশি কার্যকরী।
  2. অন্তহীন সিকোয়েন্স: ইনফিনিট সিকোয়েন্স তৈরি করা যায় (যেমন range), যেটি নির্দিষ্ট সংখ্যক উপাদান বের করার সময় পর্যন্ত মেমোরি ব্যবহার করে না।
  3. ডিনামিক ইভ্যালুয়েশন: লেজি সিকোয়েন্সের উপাদানগুলো তখনই মূল্যায়ন করা হয় যখন সেগুলোর প্রয়োজন পড়ে, ফলে লেজি প্রোগ্রামিং এর সুবিধা পাওয়া যায়।

উদাহরণ: Lazy Sequence এবং Sequence API

(defn even-squares [n]
  (lazy-seq (if (zero? n)
              nil
              (cons (* n n) (even-squares (- n 2))))))

(take 5 (even-squares 10))  ; আউটপুট: (100 64 36 16 4)

এখানে, even-squares একটি লেজি সিকোয়েন্স তৈরি করছে যেখানে প্রথম ৫টি সোজা সংখ্যার বর্গ (100, 64, 36, 16, 4) বের করা হয়েছে।


সারসংক্ষেপ

  • Sequence API ক্লোজারে সিকোয়েন্সের ওপর বিভিন্ন কার্যকলাপ (যেমন: map, filter, reduce) করতে ব্যবহৃত হয়, যা ফাংশনাল প্রোগ্রামিংয়ের মূল অংশ।
  • Lazy Sequences হল এমন সিকোয়েন্স যা প্রয়োজন অনুযায়ী শুধুমাত্র মূল্যায়ন হয়, ফলে মেমোরি দক্ষ এবং বড় সিকোয়েন্সের ক্ষেত্রে কার্যকরী।
  • Lazy evaluation এর মাধ্যমে আপনি ইনফিনিট সিকোয়েন্সও ব্যবহার করতে পারেন, যেমন: range অথবা কাস্টম লেজি সিকোয়েন্স lazy-seq ব্যবহার করে।

Clojure-এ সিকোয়েন্স এবং লেজি সিকোয়েন্সের মাধ্যমে ডেটা ম্যানিপুলেশন কার্যকরী এবং মেমোরি সাশ্রয়ীভাবে করা যায়।

common.content_added_by

Collection Manipulation Functions: conj, assoc, dissoc

266
266

Collection Manipulation Functions in Clojure: conj, assoc, dissoc

Clojure provides several powerful functions to manipulate collections such as lists, vectors, maps, and sets. Three of the most commonly used functions for modifying collections are conj, assoc, and dissoc. These functions are all designed to work in an immutable way, meaning they don't modify the original collection but instead return a new modified collection.

Let's go over each function with examples:


1. conj (Add to collection)

The conj function is used to add elements to a collection. The behavior of conj depends on the type of collection it is applied to:

  • For a list, it adds the element to the front of the list (since lists are linked structures).
  • For a vector, it adds the element to the end of the vector.
  • For a set, it adds the element to the set, ensuring that there are no duplicates.

Example: conj with Lists, Vectors, and Sets

; Using conj with a List
(def my-list '(2 3 4))
(def new-list (conj my-list 1)) 
; my-list is unchanged, new-list is (1 2 3 4)
(println new-list)

; Using conj with a Vector
(def my-vector [1 2 3])
(def new-vector (conj my-vector 4))
; my-vector is unchanged, new-vector is [1 2 3 4]
(println new-vector)

; Using conj with a Set
(def my-set #{2 3})
(def new-set (conj my-set 1))
; my-set is unchanged, new-set is #{1 2 3}
(println new-set)
  • In the case of the list, 1 is added at the front.
  • For the vector, 4 is added at the end.
  • In the set example, the number 1 is added to the set if it’s not already present.

2. assoc (Add or update key-value pairs in a map)

The assoc function is used to add or update key-value pairs in a map. If the key already exists, it updates the value associated with that key. If the key does not exist, it adds the key-value pair to the map.

Example: assoc with Maps

; Using assoc to add or update key-value pairs in a Map
(def my-map {:name "Alice" :age 30})
(def new-map (assoc my-map :age 31 :city "New York"))
; my-map is unchanged, new-map is {:name "Alice", :age 31, :city "New York"}
(println new-map)
  • The :age key is updated with the new value 31.
  • The :city key-value pair is added to the map.

3. dissoc (Remove key-value pairs from a map)

The dissoc function removes one or more key-value pairs from a map. It returns a new map with the specified keys removed.

Example: dissoc with Maps

; Using dissoc to remove key-value pairs from a Map
(def my-map {:name "Alice" :age 30 :city "New York"})
(def new-map (dissoc my-map :age :city))
; my-map is unchanged, new-map is {:name "Alice"}
(println new-map)
  • The keys :age and :city are removed from the map.

Summary of conj, assoc, and dissoc

FunctionDescriptionExample Usage
conjAdds an element to a collection (front for lists, end for vectors, and to the set)(conj [1 2] 3)[1 2 3], (conj #{1 2} 3)#{1 2 3}
assocAdds or updates key-value pairs in a map(assoc {:a 1} :b 2){:a 1 :b 2}
dissocRemoves one or more key-value pairs from a map(dissoc {:a 1 :b 2} :b){:a 1}

Key Points to Remember:

  • conj modifies the collection by adding elements at the correct position based on the type (beginning for lists, end for vectors).
  • assoc is specifically used to add or modify key-value pairs in a map.
  • dissoc removes key-value pairs from a map.

These functions return a new collection and do not mutate the original collection, which is a core principle of functional programming and immutability in Clojure.

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion